מבוא למדעי המחשב 2017 תרגול 8 רשימה משורשרת כללית, Comparator
בתרגול היום. LinkedList בניית ההכללה מ- LinkIntList תרגול המבנה ושימושיו ממשקים: Comparator Sorted Linked List ל- LinkedList ע"י שימוש ב- Comparator
תזכורת: רשימה משורשרת רשימה המשורשרת היא אוסף איברים, בכל איבר מאוחסן מידע ברשימה. איבר ברשימה הינו מסוג Link וכן מצביע לאיבר הבא כל הרשימה נקראת LinkedList null Link Data Next
תזכורת: המחלקה Link public class Link { // ---------------------- fields ---------------------- private Object data; private Link next; // ---------------------- constructors ---------------------- public Link(Object data, Link next) { this.data = data; this.next = next; public Link(Object data) { this(data, null); public Link getnext() { public void setnext(link link) { public Object getdata() { public String tostring() { public boolean equals(object other) { 4
השיטה tostring של המחלקה Link public String tostring() { String output = ""; if (data!= null){ output = data.tostring(); return output; 5
תזכורת: המחלקה LinkedList public class LinkedList implements List{ // ---------------------- fields ---------------------- private Link first; private Link last; // ---------------------- constructors ---------------------- public LinkedList(){ first = null; last = null; // ---------------------- methods ---------------------- public boolean isempty() { public Object get(int index) { public String tostring() { public boolean equals(object other) { public int size() { public void add(object element) { public void add(int index,object element) { public boolean contains(object element) { 6
השיטה tostring של המחלקה LinkedList public String tostring() { String output = "<"; Link current = first; while (current!= null) { output = output + current.tostring()+ ","; current = current.getnext(); output = output.substring(0, output.length()-1) + ">"; return output; 7
דריסה )Overriding) ו"כלל הבצל" LinkedList Link Object first last Link Link Object data next Object Link String tostring() boolean equals(object other) String tostring() boolean equals(object other) : : : String tostring() String tostring() boolean equals(object other) boolean equals(object other) : : : 8
השיטה Link של המחלקה equals public boolean equals(object other) { boolean isequal = true; if (! (other instanceof Link)) isequal = false; else { Link otherlink = (Link) other; if (data == null){ if (otherlink.data!= null){ isequal = false; else{ isequal = data.equals(otherlink.data); return isequal; 9
LinkedList השיטה equals של המחלקה public boolean equals(object other) { boolean isequal = true; if (! (other instanceof LinkedList)) isequal = false; else { Link mycurrent = first; Link othercurrent = ((LinkedList) other).first; while (isequal & mycurrent!= null & othercurrent!= null) { isequal = mycurrent.equals(othercurrent); mycurrent = mycurrent.getnext(); othercurrent = othercurrent.getnext(); if (isequal) isequal = (mycurrent == null && othercurrent == null); return isequal; 10
הפסקה 11
המחלקה Student public class Student{ // ---------------------- fields ---------------------- private String name; private LinkedList grades; private int id; // ---------------------- constructors ---------------------- public Student(String studentname, int studentid) { name = studentname; id = studentid; grades = new LinkedList(); public void addgrade(integer grade) {grades.add(grade); public String getname() {return name public double calcavarage() { public String tostring() { public boolean equals(object other) { 12
ממשקים ממשק מייצג רעיון מופשט. הממשק )interface) הינו כלי למימוש עיקרון ההפרדה בין הכרזה למימוש. מבחינת המתכנת, ממשק הוא חוזה עבור הפונקציות שצריך למלא. ממשק קובע את הפונקציונאליות המשותפת לכל המחלקות המממשות אותו.
ממשקים הצהרה על ממשק: public interface <name> { <methods list> ממשקים מתארים שיטות )public( ללא מימושן. ממשקים אינם כוללים בנאים שכן אין דרך ליצר מופע )אובייקט( של ממשק אלא רק של מחלקה המממשת את הממשק. בדומה לשימוש במחלקות, המשתמש בממשק אינו צריך להכיר את פרטי המימוש של השיטות השונות.
הממשק Comparator public interface Comparator { public int compare(object obj1,object obj2); החוזה של השיטה אומר: יהיו a ו- b שני עצמים בני השוואה a > b compare(a,b) > 0 a.equals(b) compare(a,b) = 0 a < b compare(a,b) < 0 מימוש השיטה compare מגדיר את סוג ההשוואה המתבצעת 15
מימושים שונים לממשק Comparator public class StudentIDComparator implements Comparator { public int compare(object s1, Object s2) { if (! (s1 instanceof Student)!(s2 instanceof Student)) throw new RuntimeException(...); return ((Student) s1).getid()-((student) s2).getid(); public class StudentAverageComparator implements Comparator { public int compare(object s1, Object s2) { if (! (s1 instanceof Student)!(s2 instanceof Student)) throw new RuntimeException(...); double diff = ((Student) s2).calcavarage()-((student) s1). calcavarage(); if (diff > 0) return (int)(diff+1); return (int)diff;
הוספת findminvalue למחלקה LinkedList public Object findminvalue(comperator c){ Object minvalue = first.getdata(); Link currentlink = first; while (currentlink!= null){ if (c.compare(currentlink.getdata(), minvalue) < 0){ minvalue = currentlink.getdata() ; currentlink = currentlink.getnext(); return minvalue;
public Int id: static 1234 void main(string[] Object args) data: 92 Link first: { Student LinkedList grades: s1 = new Student( Dana,1234); Link next: s1.addgrade(92); Student s1.addgrade(56); String name: Yossi s1.addgrade(70); Int id: 5678 Link first: Student LinkedList s2 = grades: new Student( Yossi,5678); s2.addgrade(35); Student s2.addgrade(60); String name: Itay Student s3 = new Int id: Student( Itay,91011); Link first: s3.addgrade(100); LinkedList grades: s3.addgrade(98); Type Name Value Student Student Student Student String name: Dana s1 s2 s3 רשימה משורשרת של סטודנטים LinkedList Link Link Link Object data: 35 Link next: Object data: 56 Link next: LinkedList Link Link Object data: 100 Link next: Object data: 65 Link next: null Object data: 70 Link next: null LinkedList Link Link Object data: 98 Link next: null
רשימה משורשרת של סטודנטים public static void main(string[] Student args) {... String name: Dana LinkedList studentlist = new Int id: LinkedList(); 1234... studentlist.add(s1); LinkedList grades: studentlist.add(s2); studentlist.add(s3); Type Name Value Student Student Student LinkedList s1 s2 s3 studentlist Student String name: Yossi Int id: 5678 LinkedList grades:... Student String name: Itay Int id: 91011 LinkedList grades:... LinkedList Link Link Link Object data: Object data: Object data: Link first: Link next: Link next: Link next: null 19
החזרת המינימום ברשימה משורשרת public static void main(string[] args) { LinkedList studentlist = new LinkedList(); Comparator idcomp = new StudentIDComparator(); Comparator averagecomp = new StudentAverageComparator(); Object o1 = studentlist.findminvalue(idcomp); Object o2 = studentlist.findminvalue(averagecomp); Reference Type Name Instance Type value Comparator idcomp StudentIDComparator Comparator averagecomp StudentAverageComparator Object o1 Student Object o2 Student String name: Dana Int id: 1234 LinkedList grades: String name: Itay Int id: 91011 LinkedList grades:
השיטה tostring של המחלקה Student public String tostring() { return [ + Name: +name +, ID: + id +, Grades: + grades + ] ; public static void main(string[] args) { Student s = new Student( Dana,1234); s.addgrade(92); s.addgrade(56); s.addgrade(70); System.out.println(s); [Name: Dana, ID: 1234, Grades: <92, 56, 70>] 21
רשימה משורשרת של סטודנטים public static void main(string[] args) { Student s1 = new Student( Dana,1234); s1.addgrade(92); s1.addgrade(56); s1.addgrade(70); Student s2 = new Student( Yossi,5678); s2.addgrade(35); s2.addgrade(60); Student s3 = new Student( Itay,91011); s3.addgrade(100); s3.addgrade(98); LinkedList studentlist = new LinkedList(); studentlist.add(s1); studentlist.add(s2); studentlist.add(s3); System.out.println(studentList); <[Name: Dana, ID: 1234, Grades: <92, 56, 70>], [Name: Yossi, ID: 5678, Grades: <35, 60>], [Name: Itay, ID: 91011, Grades: <100, 98>]> 22